/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package daoimpl;

import controller.ConnectionMySQL;
import dao.AgendarConsultaDao;
import enun.EstadoCivil;
import enun.Sexo;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import model.AgendarConsulta;
import model.Dentista;
import model.Endereco;
import model.Paciente;

/**
 *
 * @author Rodrigo
 */
public class AgendarConsultaDaoImpl implements AgendarConsultaDao {

    @Override
    public void salvar(AgendarConsulta a) {

        String sql = "INSERT INTO consulta (data,hora,descricao,id_paciente,id_dentista) values(?,?,?,?,?)";

        try {
            PreparedStatement ps = ConnectionMySQL.getConnection().prepareStatement(sql);
            ps.setDate(1, java.sql.Date.valueOf(new SimpleDateFormat("yyyy-MM-dd").format(a.getDataConsulta())));
            ps.setString(2, a.getHora());
            ps.setString(3, a.getDescricao());
            ps.setInt(4, a.getPaciente().getId());
            ps.setInt(5, a.getDentista().getId());

            ps.execute();

        } catch (SQLException ex) {
            Logger.getLogger(AgendarConsultaDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    @Override
    public void deletar(AgendarConsulta a) {
            String sql = "delete from consulta where id = ?";
        try {
            PreparedStatement ps = ConnectionMySQL.getConnection().prepareStatement(sql);
            ps.setInt(1, a.getId());
            ps.execute();

        } catch (SQLException e) {
            System.out.println("ERROR !");
            
        }
    }

    @Override
    public void alterar(AgendarConsulta a) {
        
          String sql = "UPDATE consulta SET data=?,hora=?,descricao=? WHERE id=? ";

        try {
            PreparedStatement ps = ConnectionMySQL.getConnection().prepareStatement(sql);
            ps.setDate(1, java.sql.Date.valueOf(new SimpleDateFormat("yyyy-MM-dd").format(a.getDataConsulta())));
            ps.setString(2, a.getHora());
            ps.setString(3, a.getDescricao());
            ps.setInt(4, a.getId());          

            ps.execute();

        } catch (SQLException ex) {
            Logger.getLogger(AgendarConsultaDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }

    @Override
    public List<AgendarConsulta> consultarTodasConsultas() {

        String sql = " SELECT c.id,c.data,c.hora,c.descricao,p.id,p.nome,p.idade,p.sexo,"
                + " p.estadocivil,d.id,d.nome,d.numeroCRO,e.logadouro,e.bairro,e.numero,e.cidade from consulta c "
                + " INNER JOIN paciente p on c.id_paciente = p.id "
                + " INNER JOIN dentista d on c.id_dentista = d.id "
                + " INNER JOIN endereco e on e.idendereco = p.id_endereco Order by c.data ";
        List<AgendarConsulta> consultas = new ArrayList<>();
        try {
            PreparedStatement ps = ConnectionMySQL.getConnection().prepareStatement(sql);
            ResultSet rs = ps.executeQuery();

            while (rs.next()) {
                AgendarConsulta a = new AgendarConsulta();
                Paciente p = new Paciente();
                Dentista d = new Dentista();
                Endereco e = new Endereco();
                a.setDentista(d);
                a.setPaciente(p);
                p.setEndereco(e);

                a.setId(rs.getInt("c.id"));
                a.setDataConsulta(rs.getDate("c.data"));
                a.setHora(rs.getString("c.hora"));
                a.setDescricao(rs.getString("c.descricao"));
                   p.setId(rs.getInt("p.id"));
                p.setNome(rs.getString("p.nome"));
                p.setIdade(rs.getInt("p.idade"));
                p.setSexo(Sexo.valueOf(rs.getString("p.sexo")));
                p.setEstadoCivil(EstadoCivil.valueOf(rs.getString("p.estadocivil")));
                d.setId(rs.getInt("d.id"));
                d.setNome(rs.getString("d.nome"));
                d.setNumeroCRO(rs.getInt("d.numeroCRO"));
                e.setLogadouro(rs.getString("e.logadouro"));
                e.setBairro(rs.getString("e.bairro"));
                e.setNumero(rs.getString("e.numero"));
                e.setCidade(rs.getString("e.cidade"));

                consultas.add(a);

            }
        } catch (SQLException ex) {
            Logger.getLogger(AgendarConsultaDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
        }

        return consultas;
    }

    @Override
    public boolean isVerificaConsula(AgendarConsulta a) {

        String sql = "Select count(*) as qtd from consulta c  "
                + " INNER JOIN dentista d on d.id = c.id_dentista"
                + " where c.hora = ? and c.data=? and d.nome = ? ";
        Long qtd = null;
        try {
            PreparedStatement ps = ConnectionMySQL.getConnection().prepareStatement(sql);
            ps.setString(1, a.getHora());
            ps.setDate(2, java.sql.Date.valueOf(new SimpleDateFormat("yyyy-MM-dd").format(a.getDataConsulta())));
            ps.setString(3, a.getDentista().getNome());
            ResultSet rs = ps.executeQuery();
            if (rs.next()) {
                qtd = rs.getLong("qtd");
            }
        } catch (SQLException ex) {
            Logger.getLogger(AgendarConsultaDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
        }

        return qtd > 0;
    }

    @Override
    public List<AgendarConsulta> consultaComFiltro(String nome, Date data) {
        String sql = "";

        sql = " SELECT  c.id ,c.data,c.hora,c.descricao,p.nome,p.sexo,p.idade, "
                + " p.estadocivil,d.nome,d.numeroCRO,e.logadouro,e.bairro,e.numero,e.cidade from consulta c "
                + " INNER JOIN paciente p on c.id_paciente = p.id "
                + " INNER JOIN dentista d on c.id_dentista = d.id "
                + " INNER JOIN endereco e on e.idendereco = p.id_endereco "
                + " Where 1 = 1";

        if (nome != null && !"".equals(nome)) {
            sql += " AND UPPER(p.nome) Like UPPER(?) ";
        }

        if (data != null) {
            sql += " AND UPPER(c.data) Like UPPER(?) ";

        }

        List<AgendarConsulta> consultas = new ArrayList<>();

        try {
            PreparedStatement ps = ConnectionMySQL.getConnection().prepareStatement(sql);

            if (nome != null && !"".equals(nome)) {
                ps.setString(1, "%" + nome + "%");
            }
            if (data != null) {
                if (nome.equals("")) {
                    ps.setDate(1, java.sql.Date.valueOf(new SimpleDateFormat("yyyy-MM-dd").format(data)));
                } else if (data != null) {
                    ps.setDate(2, java.sql.Date.valueOf(new SimpleDateFormat("yyyy-MM-dd").format(data)));
                }
            }

            ResultSet rs = ps.executeQuery();

            while (rs.next()) {
                AgendarConsulta a = new AgendarConsulta();
                Paciente p = new Paciente();
                Dentista d = new Dentista();
                Endereco e = new Endereco();
                a.setDentista(d);
                a.setPaciente(p);
                p.setEndereco(e);
                a.setId(rs.getInt("c.id"));
                a.setDataConsulta(rs.getDate("c.data"));
                a.setHora(rs.getString("c.hora"));
                a.setDescricao(rs.getString("c.descricao"));
                p.setNome(rs.getString("p.nome"));
                p.setIdade(rs.getInt("p.idade"));
                p.setSexo(Sexo.valueOf(rs.getString("p.sexo")));
                p.setEstadoCivil(EstadoCivil.valueOf(rs.getString("p.estadocivil")));
                d.setNome(rs.getString("d.nome"));
                d.setNumeroCRO(rs.getInt("d.numeroCRO"));
                e.setLogadouro(rs.getString("e.logadouro"));
                e.setBairro(rs.getString("e.bairro"));
                e.setNumero(rs.getString("e.numero"));
                e.setCidade(rs.getString("e.cidade"));

                consultas.add(a);

            }
        } catch (SQLException ex) {
            Logger.getLogger(AgendarConsultaDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
        }

        return consultas;
    }

}
